package com.stt.videoprocess.design.state.impl;

import com.stt.videoprocess.design.model.ProcessingStatus;
import com.stt.videoprocess.design.model.VideoTask;
import com.stt.videoprocess.design.state.VideoProcessingState;
import lombok.extern.slf4j.Slf4j;

/**
 * 暂停状态实现
 * 1. 任务暂停，可以恢复处理
 */
@Slf4j
public class PausedState implements VideoProcessingState {
    /**
     * 处理视频任务的方法，当任务暂停时调用
     * @param task 视频任务对象，包含任务相关信息
     */
    @Override
    public void handle(VideoTask task) {
        log.info("任务已暂停: {}", task.getTaskId());
    }

    /**
     * 尝试开始处理视频任务，但从暂停状态开始处理是不允许的
     * @param task 视频任务对象，包含任务相关信息
     * @throws IllegalStateException 如果尝试从暂停状态开始处理，抛出此异常
     */
    @Override
    public VideoProcessingState startProcessing(VideoTask task) {
        throw new IllegalStateException("不允许从暂停状态转为开始状态");
    }

    /**
     * 尝试暂停视频任务处理，但任务已经处于暂停状态，再次暂停是不允许的
     * @param task 视频任务对象，包含任务相关信息
     * @throws IllegalStateException 如果任务已经处于暂停状态，抛出此异常
     */
    @Override
    public VideoProcessingState pauseProcessing(VideoTask task) {
        throw new IllegalStateException("该任务已经暂停");
    }

    /**
     * 从暂停状态恢复视频任务处理
     * 更新任务状态为处理中，并设置当前时间为更新时间
     * @param task 视频任务对象，包含任务相关信息
     * @return 返回一个新的处理状态对象，表示任务正在处理中
     */
    @Override
    public VideoProcessingState resumeProcessing(VideoTask task) {
        task.setStatus(ProcessingStatus.PROCESSING);
        task.setUpdateTime(java.time.LocalDateTime.now());
        return new ProcessingState();
    }

    /**
     * 尝试完成视频任务处理，但从暂停状态直接完成是不允许的
     * @param task 视频任务对象，包含任务相关信息
     * @throws IllegalStateException 如果尝试从暂停状态直接完成任务，抛出此异常
     */
    @Override
    public VideoProcessingState completeProcessing(VideoTask task) {
        throw new IllegalStateException("不可从暂停状态转为完成状态");
    }

    /**
     * 处理视频任务失败，设置任务状态为失败，并记录错误信息和更新时间
     * @param task 视频任务对象，包含任务相关信息
     * @param errorMessage 错误信息，描述任务失败的原因
     * @return 返回一个新的失败状态对象，表示任务处理失败
     */
    @Override
    public VideoProcessingState failProcessing(VideoTask task, String errorMessage) {
        task.setStatus(ProcessingStatus.FAILED);
        task.setErrorMessage(errorMessage);
        task.setUpdateTime(java.time.LocalDateTime.now());
        return new FailedState();
    }
}
